package fi.uba.algocontrol.model.niveles;


import org.dom4j.io.*;
import org.dom4j.*;
import org.xml.sax.InputSource;

import javax.swing.*;
import java.io.File;
import java.util.Iterator;

public class NivelManager
{
    private Niveles niveles = null;
    private static NivelManager INSTANCE = null;
    private static Integer NIVELACTUAL = null;

    private NivelManager() throws NivelManagerException
    {

        this.niveles = new Niveles();

        Document doc;
        try
        {
            SAXReader saxReader = new SAXReader();
            doc = saxReader.read(new File("niveles.xml"));
        }
        catch(Exception e)
        {
            throw new NivelManagerException("No se pudo leer niveles.xml \n Error: " + e.getMessage());
        }

            for(Iterator i = doc.getRootElement().elements().iterator(); i.hasNext();)
            {
                Element nivel              = (Element) i.next();

                if (nivel.attribute("id") == null)
                    throw new NivelManagerException("Falta el id de algun nivel. Revise la configuracion en niveles.xml");

                Integer nivelId         = Integer.valueOf(nivel.attribute("id").getText());

                String nivelNombre = "";
                if (nivel.attribute("nombre") != null)
                    nivelNombre  = String.valueOf(nivel.attribute("nombre").getText());

                Element dificultad         = (Element) nivel.element("dificultad");

                if (dificultad == null)
                    throw new NivelManagerException("Hubo un error cargando la dificultad del nivel de id=" + nivelId + ", revise el archivo niveles.xml");

                Integer cantidadAviones;
                Integer intervaloAparicion;
                Integer velocidadAviones;

                if (dificultad.element("cantidadAviones") == null)
                    throw new NivelManagerException("Falta el elemento cantidadAviones en la dificultad del nivel " + nivelId + " en niveles.xml");

                if (dificultad.element("intervaloAparicion") == null)
                    throw new NivelManagerException("Falta el elemento intervaloAparicion en la dificultad del nivel " + nivelId + " en niveles.xml");

                if (dificultad.element("velocidadAviones") == null)
                    throw new NivelManagerException("Falta el elemento velocidadAviones en la dificultad del nivel " + nivelId + " en niveles.xml");


                cantidadAviones     = Integer.valueOf(dificultad.element("cantidadAviones").getText());
                intervaloAparicion  = Integer.valueOf(dificultad.element("intervaloAparicion").getText());
                velocidadAviones    = Integer.valueOf(dificultad.element("velocidadAviones").getText());



                //TODO: Cargar niveles por dom4j
                Nivel nivelObj = new Nivel(nivelId, nivelNombre,   new Dificultad(cantidadAviones,intervaloAparicion,velocidadAviones));
                this.niveles.put(nivelId, nivelObj);
            }



        NIVELACTUAL = 1;
    }

    public static NivelManager getInstance()
    {
       if (INSTANCE == null)
       {
           try
           {
               INSTANCE = new NivelManager();
           }
           catch(NivelManagerException e)
           {
               JOptionPane.showMessageDialog(null, e.getMessage(), "Error cargando niveles", JOptionPane.ERROR_MESSAGE);
           }
       }

       return INSTANCE;
    }

    public Integer getCantidadNiveles()
    {
        return this.niveles.size();
    }

    public Niveles getNiveles()
    {
        return this.niveles;
    }

    public Nivel getNivel(Integer id)
    {
        return this.niveles.get(id);
    }

    public void pasarNivel()
    {
        NIVELACTUAL++;
    }

    public Nivel getNivelActual()
    {
        return this.niveles.get(NIVELACTUAL);
    }
}
